// request.js 封装请求
const REQUEST_TIMEOUT = 10 * 1000; // 请求超时时间，默认为20秒

// 保存用户名到 cookie，设置过期时间为30天
function setCookie(name, value) {
  const now = new Date();
  const expireTime = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000); // 30天后过期
  const cookieValue = {
    value: value,
    expire: expireTime.getTime() // 过期时间戳
  };
  uni.setStorageSync(name, cookieValue);
}

// 获取 cookie 中的用户名，检查是否过期
function getUsernameFromCookie() {
  const cookie = uni.getStorageSync('oausername');
  if (!cookie) {
    return null; // 如果没有找到cookie，返回null
  }

  const now = new Date().getTime();
  if (now > cookie.expire) {
    // 如果当前时间超过过期时间
    uni.removeStorageSync('oausername'); // 删除过期的cookie
    return null; // 返回null
  }

  return cookie.value; // 返回有效的用户名
}

// 获取 baseUrl
function getBaseUrl() {
  const baseUrl = uni.getStorageSync('serverUrl');
  if (!baseUrl) {
    uni.showToast({
      title: '未配置服务器地址',
      icon: 'none',
      duration: 2000
    });
    return null;
  }
  return baseUrl;
}

// 请求拦截器
// uni.$u.http.interceptors.request.use((config) => {
//   config.header.cookie = uni.getStorageSync('cookie');
//   return config;
// });

// 响应拦截器
// uni.$u.http.interceptors.response.use((response) => {
//   if (response.cookies) {
//     uni.setStorageSync('cookie', response.cookies);
//   }
//   return response.data;
// });

// function isObject(obj) {
//   return typeof obj === 'object' && obj !== null && !Array.isArray(obj);
// }

// 封装 uni.request
const request = (options) => {
  return new Promise((resolve, reject) => {
    // 获取 baseUrl
    let baseUrl = getBaseUrl();

    if (!baseUrl) {
      reject('未配置服务器地址');
      return;
    }
    if (!baseUrl.endsWith('/')) {
      baseUrl = baseUrl + '/'
    }

    // 设置请求参数
    const {
      url,
      method = 'post',
      data = {},
      isFormData = false,
      headers = {}
    } = options;

    // 显示加载中
    uni.showLoading({
      title: '加载中...',
      mask: true
    });

    const formContentType = 'application/x-www-form-urlencoded;charst=UTF-8';
    const contentType = isFormData ? formContentType : 'application/json';
    // 设置请求头
    let headerOption = {
      'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
      'Content-Type': contentType,
    };

    const requestData = isFormData ? formatFormData(data) : data;
    if (headers['Content-Type']) {
      headerOption['Content-Type'] = headers['Content-Type'];
    }
    // console.log('-------------------------------------------------------------------------');
    console.log('`${baseUrl}${url}`', `${baseUrl}${url}`);
    console.log('请求参数data', data);
    // console.log('requestData', requestData);
    // console.log('headerOption', headerOption);

    uni.request({
      url: `${baseUrl}${url}`,
      method,
      data: requestData,
      header: headerOption,
      // withCredentials: true,
      timeout: REQUEST_TIMEOUT,
      success: (res) => {
        console.log('接口返回值res', res);

        const data = res.data || res || {};
        if (data.code === '0' || res.statusCode === 200) {
          resolve(data); // 请求成功，返回数据
        } else {
          reject(data); // 请求失败，返回错误信息

          uni.showToast({
            title: data.msg || '请求失败',
            icon: 'none',
            duration: 2000
          });
        }
      },
      fail: (error) => {
        reject(error); // 返回错误信息
        console.log(`错误的接口地址是：${url}`);
        uni.showToast({
          title: '网络错误，请检查连接',
          icon: 'none',
          duration: 2000
        });
      },
      complete: (res) => {
        // console.log(`请求完毕 -- ${baseUrl}${url}`);
        uni.hideLoading(); // 隐藏加载中
        // console.log('Request Cookies:', JSON.stringify(res.cookies));
      },
    });
  });
};

// 格式化表单数据
function formatFormData(data) {
  // console.log('formatFormData', data);
  return Object.keys(data)
    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`)
    .join('&');
}

export {
  request,
  getBaseUrl,
  setCookie,
  getUsernameFromCookie
};
